/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package server.communication;

import java.awt.Point;
import java.util.ArrayList;
import java.util.Date;
import org.apache.log4j.Logger;
import data.Gameroom;
import data.Gameroom.Gametype;
import data.Gebruiker;
import data.Score;

/**
 *
 * @author 
 */
public class CSAXHandlerServer {
    //attributen
    private Logger logger = Logger.getLogger(CSAXHandlerServer.class);
    private ServerCommunication serverCom;
    private Gebruiker gebruiker1;
    private Gameroom gameroom;
    private ArrayList<Gebruiker> gebruikersLijst;
    private ArrayList<String> woordenLijst,  letterLijst;
    private String bericht,  nickname,  nicknameOprichter,  password,  ontvanger,  gameNaam,  avatar,  extra,  passwordGameroom,  hobbys,  geslacht,  email,  nieuwWoord,  letter,  filename;
    private boolean gaming,  online,  blanco;
    private int clienthandler,  maxAantalSpelers,  scoreId,  x,  y,  xOud,  yOud,  score,  aantalLetters,  maxTijdPerBeurt,  maxAantalKeerGepast, maxAantalKeerBeurtVerlopen;
    private Date geboortedatum;
    private Gametype gametype;
    private String[][] bogglebord;
    private int rij,kolom;

    public CSAXHandlerServer(ServerCommunication s, int clh) {
        serverCom = s;
        clienthandler = clh;
        gebruiker1 = null;
        bericht = null;
        resetGebruiker();
    }

    //chatten
    public void startChat() {

    }

    public void endChat() {
        serverCom.zendChatBerichtNaarIedereen(nickname, bericht);
        resetChat();
    }

    public void startPriveChat() {
    }

    public void endPriveChat() {
        serverCom.zendPriveBericht(nickname, bericht, ontvanger);
        resetChat();
    }

    /**
     * 
     * --------------- Registreren ---------------
     * 
     */
    public void startRegistreerGebruiker() {
        gebruiker1 = new Gebruiker();
    }

    public void endRegistreerGebruiker() {
        maakGebruiker();
        serverCom.voegGebruikerToe(gebruiker1);
        resetGebruiker();
    }

    public void startCheckNicknameBestaatAl() {

    }

    public void endCheckNicknameBestaatAl() {
        serverCom.checkNicknameBestaatAl(nickname, clienthandler);
    }

    public void startZendAvatarAanvraag() {

    }

    public void endZendAvatarAanvraag() {
        logger.info("in endzendavataraanvraag");
        serverCom.startAvatarSocket(clienthandler, filename);
    }
    
    public void startGeefAvatarAanvraag(){
        
    }
    
    public void endGeefAvatarAanvraag(){
        serverCom.startGeefAvatarSocket(nickname,clienthandler);
    }

    /**
     * 
     * --------------- Inloggen ------------------
     * 
     */
    //spelerAlOnline
    public void startSpelerAlOnline() {
    }

    public void endSpelerAlOnline() {
        serverCom.spelerAlOnline(nickname, clienthandler);
        resetNickname();
    }

    //getSpelerByLogin
    public void startGetSpelerByLogin() {
    }

    public void endGetSpelerByLogin() {
        serverCom.loginGebruiker(clienthandler, nickname, password);
        resetGebruiker();
    }

    //getSpelerByLogin
    public void startGetSpelerByNickname() {
    }

    public void endGetSpelerByNickname() {
        logger.info("endgetSPlerByNickname wordn nu doorgestuurd naar servercom.");
        serverCom.GetSpelerByNickname(clienthandler, nickname);
        resetGebruiker();
    }

    //speler Online
    public void startSpelerOnline() {
    }

    public void endSpelerOnline() {
        serverCom.zendLoginNaarAndereClient(clienthandler, nickname);
        resetNickname();
    }

    //speler offline
    public void startSpelerOffline() {
    }

    public void endSpelerOffline() {
        serverCom.spelerOffline(nickname);
        resetNickname();
    }

    //start update gebruiker
    public void startUpdateGebruiker() {
        gebruiker1 = new Gebruiker();

    }

    public void endUpdateGebruiker() {
        maakGebruiker();
        logger.info("speler update aanvraag doorgestuurd naar servercom");
        serverCom.updateSpeler(gebruiker1);
        resetGebruiker();
    }

    //online spelers vragen
    public void startOnlineSpelers() {
    }

    public void endOnlineSpelers() {
        serverCom.onlineSpelersOphalen();
    }

    public void startGetGamerooms() {
    }

    public void endGetGamerooms() {
        serverCom.getGamerooms(clienthandler);
    }

    public void startCreateGame() {
        gameroom = new Gameroom();
        gebruikersLijst = new ArrayList<Gebruiker>();
    }

    public void endCreateGame() {
        maakGameroom();
        serverCom.gameroomAanmaken(gameroom, clienthandler);
        resetGameroom();
    }

    public void startJoinGame() {
    }

    public void endJoinGame() {
        serverCom.joinGameroom(nickname, gameNaam);
        resetNickname();
        gameNaam = null;
    }

    public void startLeaveGame() {
    }

    public void endLeaveGame() {
        serverCom.leaveGame(nickname, gameNaam);
        resetNickname();
        gameNaam = null;
    }

    public void startChatInGame() {
    }

    public void endChatInGame() {
        serverCom.zendChatBerichtInGame(nickname, gameNaam, bericht);
        resetChat();
    }

    public void startGebruiker() {
        gebruiker1 = new Gebruiker();
    }

    public void endGebruiker() {
        if (gebruikersLijst != null) {
            maakGebruiker();
            gebruikersLijst.add(gebruiker1);
            resetGebruiker();
        }
    }

    //gelegde woorden valideren
    public void startGelegdeWoorden() {
        woordenLijst = new ArrayList<String>();
    }

    public void startNieuwWoord() {
        logger.info("nieuw woord gestart");
        nieuwWoord = new String();
    }

    public void endNieuwWoord() {
        logger.info("nieuw woord toevoegen aan woordenlijst");
        woordenLijst.add(nieuwWoord);

        resetNieuwWoord();
    }

    public void endGelegdeWoorden() {
        serverCom.woordvalidatie(nickname, gameNaam, woordenLijst, score);
        logger.info(" endGelegdeWoorden: " + woordenLijst.size());
        woordenLijst = null;
        resetNickname();
        gameNaam = null;
        score = 0;
    }
    public void startGevondenWoorden() {
        logger.info("gevondenWoorden gestart");
        woordenLijst = new ArrayList<String>();
    }
    
    public void endGevondenWoorden() {
        serverCom.woordNakijken(nickname, gameNaam, woordenLijst);
        logger.info(" endGevondenWoorden: " + woordenLijst.size());
        woordenLijst = null;
        resetNickname();
        gameNaam = null;
    }

    public void startGeefOverblijvendeLettersTerug() {
        letterLijst = new ArrayList<String>();
    }

    public void endGeefOverblijvendeLettersTerug() {
        serverCom.scoreOpslaan(letterLijst, nickname, gameNaam);
        letterLijst = null;
        gameNaam = null;
        resetNickname();
    }
    
    public void startVerhoogBoggleScore(){
        
    } 
    public void endVerhoogBoggleScore(){
        Score s = serverCom.getScore(scoreId);
        s.setBoggleGewonnen(s.getBoggleGewonnen()+1);
        s.setBoggleScore(score);
        serverCom.updateScore(s);
    } 
    public void startVerhoogVerlorenBoggleScore(){
        
    } 
    public void endVerhoogVerlorenBoggleScore(){
        Score s = serverCom.getScore(scoreId);
        s.setBoggleVerloren(s.getBoggleVerloren()+1);
        s.setBoggleScore(score);
        serverCom.updateScore(s);
    } 
    
    public void startVerhoogGalgjeScore(){
        
    } 
    public void endVerhoogGalgjeScore(){
        Score s = serverCom.getScore(scoreId);
        s.setGalgjeGewonnen(s.getGalgjeGewonnen()+1);
        serverCom.updateScore(s);
    } 
    public void startVerhoogGalgjeVerlorenScore(){
        
    } 
    public void endVerhoogGalgjeVerlorenScore(){
        Score s = serverCom.getScore(scoreId);
        s.setGalgjeVerloren(s.getGalgjeVerloren()+1);
        serverCom.updateScore(s);
    } 

    public void startGeefLettersTerug() {
        letterLijst = new ArrayList<String>();

    }

    public void endGeefLettersTerug() {
        //oproep servercom
        serverCom.geefLettersTerug(letterLijst, gameNaam);
        letterLijst = null;
        gameNaam = null;
    }

    public void startStartSpel() {
    }

    public void endStartSpel() {
        serverCom.startSpel(gameNaam);
        gameNaam = null;
    }

    //beurt doorgeven
    public void startGeefBeurtDoor() {
    }

    public void endGeefBeurtDoor() {
        serverCom.geefBeurtDoor(gameNaam);
        gameNaam = null;
    }
    
    public void endBeurtVerlopen(){
        serverCom.beurtVerlopen(nickname, gameNaam);
        gameNaam = null;
        resetNickname();
    }

    public void endPasBeurt() {
        serverCom.pasBeurt(nickname, gameNaam);
        gameNaam = null;
        resetNickname();
    }

    //het verplaatsen van blokjes doorsturen naar de andere spelers
    //zodat zij at real time zien wat de andere speler aan het doen is
    public void startVerplaatsBlokje() {

    }

    public void endVerplaatsBlokje() {
        Point p = new Point(x, y);
        Point oudePositie = new Point(xOud, yOud);
        serverCom.verplaatsBlokje(p, oudePositie, letter, blanco, clienthandler, gameNaam);
        resetBlokje();
    }

    public void startGetRandomWoord() {

    }

    public void endGetRandomWoord() {
        serverCom.getRandomWoord(clienthandler);
    }
    
    public void startReplyStuurBoggleBord(){
        bogglebord = new String[4][4];
    }
    
    public void endReplyStuurBoggleBord(){
        serverCom.replyStuurBoggleBord(nickname, bogglebord);
        bogglebord = null;
        nickname = null;
    }

    //setters
    public void setBericht(String b) {
        this.bericht = b;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public void setPaswoord(String paswoord) {
        this.password = paswoord;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setGeslacht(String geslacht) {
        this.geslacht = geslacht;
    }

    public void setHobbys(String hobbys) {
        this.hobbys = hobbys;
    }

    public void setExtra(String extra) {
        this.extra = extra;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    public void setGeboortedatum(String geboortedatum) {
        this.geboortedatum = new Date(Long.parseLong(geboortedatum));
    }

    public void setScoreId(String score) {
        this.scoreId = Integer.parseInt(score);
    }

    public void setOnline(String isonline) {
        this.online = Boolean.parseBoolean(isonline);
    }

    public void setGaming(String isgaming) {
        this.gaming = Boolean.parseBoolean(isgaming);
    }

    public void setOntvanger(String ontvanger) {
        this.ontvanger = ontvanger;
    }

    public void setGameNaam(String gameNaam) {
        this.gameNaam = gameNaam;
    }

    public void setNieuwWoord(String nieuwWoord) {
        this.nieuwWoord = nieuwWoord;
    }

    public void setMaxAantalSpelers(int aantal) {
        this.maxAantalSpelers = aantal;
    }

    public void setSpelType(String type) {
        if (type.equalsIgnoreCase("scrabble")) {
            this.gametype = Gametype.SCRABBLE;
        } else if (type.equalsIgnoreCase("boggle")) {
            this.gametype = Gametype.BOGGLE;
        }else if(type.equals("galgje")){
            this.gametype = gametype.GALGJE;
        }
    }

    public void setNicknameOprichter(String nickname) {
        this.nicknameOprichter = nickname;
    }

    public void setPasswordGameroom(String password) {
        this.passwordGameroom = password;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void setLetter(String letter) {
        this.letter = letter;
        if (letterLijst != null) {
            letterLijst.add(letter);
        }
    }

    public void setBlanco(boolean blanco) {
        this.blanco = blanco;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public void setXOud(int xOud) {
        this.xOud = xOud;
    }

    public void setYOud(int yOud) {
        this.yOud = yOud;
    }

    public void setFileName(String filename) {
        this.filename = filename;
    }

    //letters verwerken
    public void setAantalLetters(int aantal) {
        aantalLetters = aantal;
    }

    public void endAanvraagLetters() {
        serverCom.geefAantalBlokjes(aantalLetters, nickname, gameNaam);
        resetNickname();
        aantalLetters = 0;
        gameNaam = null;
    }

    public void endAanvraagLetterWaarde() {
        serverCom.AanvraagLetterWaarde(nickname, gameNaam);
    }
    
    public void startBepaalTopscore(){
        
    }
    
    public void endBepaalTopscore(){
        serverCom.bepaalTopscore(gametype,nickname);    
    }

    //reset alle veldjes
    //hierdoor kan er geen inconsistente data optreden
    //vorige waarden van variabelen kunnen niet per ongeluk gebruikt worden
    private void resetChat() {
        nickname = null;
        bericht = null;
        ontvanger = null;
        gameNaam = null;
    }

    private void resetBlokje() {
        x = 0;
        y = 0;
        xOud = 0;
        yOud = 0;
        blanco = false;
        letter = "";
        gameNaam = "";
    }

    private void resetGebruiker() {
        gebruiker1 = null;
        nickname = null;
        password = null;
        avatar = null;
        extra = null;
        hobbys = null;
        geslacht = null;
        email = "";
        gaming = false;
        online = false;
        scoreId = 0;
        geboortedatum = null;
    }

    private void resetNickname() {
        nickname = null;
    }

    private void resetNieuwWoord() {
        nieuwWoord = null;
    }

    private void resetGameroom() {
        passwordGameroom = null;
        nickname = null;
        gameNaam = null;
        gameroom = null;
        maxAantalSpelers = 0;
        gametype = null;
        gebruikersLijst = null;
        nicknameOprichter = null;
        maxTijdPerBeurt = 0;
        resetGebruiker();
    }
    //vult alle beldjes van gameroom in
    private void maakGameroom() {
        gameroom.setGamenaam(gameNaam);
        gameroom.setMaxAantalSpelers(maxAantalSpelers);
        gameroom.setPaswoord(passwordGameroom);
        gameroom.setNicknameOprichter(nicknameOprichter);
        gameroom.setType(gametype);
        gameroom.setTijdPerBeurtInSeconden(maxTijdPerBeurt);
        gameroom.setMaxAantalKeerGepast(maxAantalKeerGepast);
        gameroom.setMaxAantalKeerBeurtVerlopen(maxAantalKeerBeurtVerlopen);
        for (Gebruiker g : gebruikersLijst) {
            gameroom.addSpelers(g);
        }
    }

    //vult alle veldjes van gebruiker in
    private void maakGebruiker() {
        gebruiker1.setAvatar(avatar);
        gebruiker1.setEmail(email);
        gebruiker1.setExtra(extra);
        gebruiker1.setGaming(gaming);
        gebruiker1.setGeboortedatum(geboortedatum);
        gebruiker1.setGeslacht(geslacht);
        gebruiker1.setHobbys(hobbys);
        gebruiker1.setNickname(nickname);
        gebruiker1.setOnline(online);
        gebruiker1.setPaswoord(password);
        gebruiker1.setScoreId(scoreId);
    }

    public void setMaxTijdPerBeurt(int maxTijdPerBeurt) {
        this.maxTijdPerBeurt = maxTijdPerBeurt;
    }

    public void setMaxAantalKeerGepast(int maxAantalKeerGepast) {
        this.maxAantalKeerGepast = maxAantalKeerGepast;
    }

    public void setMaxAantalKeerBeurtVerlopen(int maxAantalKeerBeurtVerlopen) {
        this.maxAantalKeerBeurtVerlopen = maxAantalKeerBeurtVerlopen;
    }
    
    public void setRij(int rij){
        this.rij = rij;
    }
    
    public void setKolom(int kolom){
        this.kolom = kolom;
    }
    
    public void setBoggleLetter(String l){
        bogglebord[rij][kolom] = l;
    }
}
